package com.tom.architect02.mnbase.annotation.fs2.stat;


import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import androidx.appcompat.app.AppCompatActivity;

import com.tom.architect02.R;
import com.tom.architect02.mnbase.annotation.fs.InjectUtils;
import com.tom.architect02.mnbase.annotation.fs2.dynamic.DynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;


public class MainActivity extends AppCompatActivity {

    Button btn1;
    Button btn2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        InjectUtils.inject(this);
    }

    //    @OnClick({R.id.btn1, R.id.btn2})
    public void jingTaiDaiLi(View view) {
        // 1.静态代理
        Tom tom = new Tom();
//        SProxy sProxy = new SProxy(tom);
//        sProxy.buyWawa(this); // 静态代理，我委托了SProxy去购买娃娃。

        // TODO：2.动态代理，根本不需要关心，是谁帮忙买的娃娃。
        // 把需求告诉中介公司 DynamicProxy， 返回的是代理的接口对象--IProxy。
        IProxy iProxy = (IProxy) Proxy.newProxyInstance(
                tom.getClass().getClassLoader(), // 类加载器
                tom.getClass().getInterfaces(), // 类接口
                new DynamicProxy(tom)); // 动态代理对象， tom委托中介公司：DynamicProxy
//        iProxy.buyWawa(this); // 2.1 代理购买东西。

        // TODO: 3.匿名动态代理, 经常出现在三方框架中。
        IProxy iProxy2 = (IProxy) Proxy.newProxyInstance(
                tom.getClass().getClassLoader(),
                tom.getClass().getInterfaces(),
                new InvocationHandler() {
                    // o: 代理对象本身；tom: 被代理的真正对象，最后被返回。
                    @Override
                    public Object invoke(Object o, Method method, Object[] args) throws Throwable {
                        method.invoke(tom, args); // 执行代理对象的方法。--》 buyWawa方法. 每个方法都会调用一次invoke。
                        return tom;
                    }
                });
        iProxy2.buyWawa(this); // 3.1 匿名动态代理，购买东西
    }

}

